package com.cskaoyan.javase.oop1._11static._3usecase;

/**
 * static的使用场景
 * static修饰成员变量,表示静态成员变量,它属于类,全体对象共享,且全局是唯一的
 * 所以根据它的这个特点:
 *     1.属于全体对象所共享而不是独属于某个对象的成员变量
 *          所以当存在需要所有对象共享的变量时，应该使用static修饰的静态成员变量。
 *
 *     2.在整个类全局独一份的（因为类加载只有一次）
 *          所以，如果希望某个变量在类的全局独一份时，应该使用static修饰的静态成员变量。
 *
 * static修饰的成员方法,和成员方法相比对,它最大的特点是不需要创建对象,可以直接调用
 * 说白了,调用方便.
 * 根据它的这一特点,就出现了开发中的"工具类"
 * 工具类当中,所有的方法都是static方法,这样就不需要创建对象, 可以直接类名点调用方法,非常简单,也很方便
 * 常见的工具类有:
 *      Math,Arrays,Collections,Objects
 * 公司中,很多前辈大佬,也会写很多工具类,供后来者使用
 *
 * @since 11:15
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*
            对于局部变量而言
            有没有必要写一些修饰符?限制它?
            没有
            实际上局部变量可用的修饰符非常少
            肯定是不能用public,static这类的修饰的
         */
        int num = 100;
        for (int i = 0; i < 10; i++) {
            Student s = new Student();
            System.out.println("这是第" + (i + 1) + "个学生,他的学号是" + s.stuId);
        }
        System.out.println(Student.count);
    }
}

class Student {
    int stuId;
    /*
        需求一: 统计在外界new创建Student对象的次数
        既然计数,就需要计数器,需要int count;
        这个count应该是什么变量呢?
        它应该不受new对象影响,是一个属于类的,属于全体对象共享的一个变量
        应该是一个静态成员变量
     */
    static int count = 0;

    /*
        需求二: 每位同学的学号都需要自动生成
        规则是:
            学号的初始值是: 10001
        第一个学生对象的学号是10001
        第二个是10002
        第三个是10003
        ...
        这里需要一个变量,来存储接下来一个学生对象的学号
        这个变量应该不受new对象影响,而且全局唯一
        很明显是一个静态成员变量
     */
    static int initId = 10001;

    public Student() {
        /*
            每new一次对象,就需要执行一次该构造器
         */
        count++;

        /*
            第一个学生对象学号是10001
            后面逐步累加
         */
        this.stuId = initId++;
        // initId++;
    }
}